#include <util.h>
/**
* 获取应用的依赖库
* @param appPath 应用路径
* @return 依赖库路径数组
*/
vector<string> getLibs(const string& appPath) {
   vector<string> libs;
   string command = "ldd " + appPath + " 2>/dev/null";
    FILE* pipe = popen(command.c_str(), "r");
    if (!pipe) {
        return libs;
    }

    char buffer[128];
    while (fgets(buffer, sizeof(buffer), pipe) != nullptr) {
        std::string line(buffer);
        // 查找 => 符号，解析库路径
        size_t pos = line.find("=>");
        if (pos != string::npos) {
            size_t start = line.find_first_not_of(' ', pos + 2);
            size_t end = line.find('(', start);
            if (start != string::npos && end != string::npos) {
                string libPath = line.substr(start, end - start);
                // 去除首尾空格
                size_t first = libPath.find_first_not_of(' ');
                size_t last = libPath.find_last_not_of(' ');
                if (first != string::npos && last != string::npos) {
                    libs.push_back(libPath.substr(first, last - first + 1));
                }
            }
        }
    }
    pclose(pipe);
    return libs;
}
/**
* 输出应用
* @param savePath 保存路径
* @param appPath 应用路径
* @return 0 表示成功，-1 表示失败
*/
int output_app(const char *savePath,string appPath){
    // 保存应用的文件昵称
    string fileName= getFileName(appPath);
    string saveAppPath = string(savePath) + appPath;
    // 保存应用的文件
    copyFileIfNotExists(appPath.c_str(),saveAppPath.c_str());
    // 保存应用的原路径
    string txtName = string(savePath) + "/txt/" + fileName + ".txt";
    stringWriteFile(txtName.c_str(),appPath);
    // 保存应用的依赖库
    vector<string> libs = getLibs(string(appPath));
    string outputLib ="";
    for (const auto& lib : libs) {
        // 保存应用的文件
        string libName= getFileName(lib.c_str());
        string desLibPath = string(savePath) + lib;
       if(copyFileIfNotExists(lib.c_str(),desLibPath.c_str()) !=2)continue;
        outputLib +=lib+"\n";
    }
    string txtLib = string(savePath) + "/txt/" + fileName + "_lib.txt";
    if(outputLib=="")return 0;
    stringWriteFile(txtLib.c_str(),outputLib);
    return 0;
}

/**
* 恢复程序 包括依赖
* @param savePath 保存路径
* @return 0 成功 -1 失败
*/
int input_app(const char *savePath){
    // 读取应用的文件昵称
    vector<string> files;
    string txtP = string(savePath) + "/txt";
    if(listFilesInDirectory(txtP.c_str(),files)==-1)return -1;
    for (const auto& fileName : files) {
     string txtPath=txtP+"/"+fileName;
        // 打开文件
        ifstream txtFile(txtPath.c_str());
        // 检查文件是否成功打开
        if (!txtFile.is_open()) {
            cerr << "文件不存在" <<endl;
            return -1;
        }
        // 保存读取的行
        string line;
        // 逐行读取文件内容
        while (getline(txtFile, line)) {
           // 输出文件内容
           string source=string(savePath)+line;
          if(copyFileIfNotExists(source.c_str(),line.c_str())!=2)continue;
        }
        // 关闭文件
        txtFile.close();
    }
    return rmDir(savePath);
}